package com.woniuxy.threadpool;

import lombok.extern.slf4j.Slf4j;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.*;

import static com.woniuxy.untis.Sleep.sleep;

/**
 * <P> @Author: ideaAdmin
 * <P> TODO: Class
 * <P> TODO:
 * <P> Date: 2022/4/10:19:50
 * <P> Description:
 */
@Slf4j(topic = "c.c")
public class TimerTest01 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ScheduledExecutorService pool =
                Executors.newScheduledThreadPool(1);
        ExecutorService pool1 = Executors.newFixedThreadPool(1);
        log.debug("begin");
        Future<Boolean> f = pool1.submit(() -> {
            log.debug("task1");
            sleep(2L);
            int i = 1 / 0;
            return true;

        });
        log.debug("result:{}",f.get());


    }

    private static void schedule(ScheduledExecutorService pool) {
        log.debug("begin");
        //TODO 如果上个任务执行时间过长超过间隔时间 那么就不会再有间隔时间 而是继续运行
        pool.scheduleAtFixedRate(() -> {
            log.debug("runing");
            sleep(2L);
            //TODO 多久后开始执行 每隔多久开始重复执行 时间单位
        }, 1, 1L, TimeUnit.SECONDS);

        //TODO 当一个任务执行完 然后在计算间隔时间
        pool.scheduleWithFixedDelay(() -> {
            log.debug("runing...");
            sleep(2L);
        }, 1, 1, TimeUnit.SECONDS);
    }

    /**
     * TODO:使用任务调度器执行计时
     **/
    private static void timing(ScheduledExecutorService pool) {
        log.debug("begin");
        pool.schedule(() -> {
            log.debug("task1");
            sleep(2L);
            try {
                int i = 1 / 0;
            } catch (Exception e) {
                log.debug("err", e);
            }

        }, 1, TimeUnit.SECONDS);

        pool.schedule(() -> {
            log.debug("task2");
        }, 1, TimeUnit.SECONDS);
    }

    private static void timerTest() {
        Timer timer = new Timer();
        TimerTask task1 = new TimerTask() {
            @Override
            public void run() {
                log.debug("task 1");
                sleep(2L);
            }
        };
        TimerTask task2 = new TimerTask() {
            @Override
            public void run() {
                log.debug("task 2");
            }
        };
        // 使用 timer 添加两个任务，希望它们都在 1s 后执行
        // 但由于 timer 内只有一个线程来顺序执行队列中的任务，因此『任务1』的延时，影响了『任务2』的执行     timer.schedule(task1, 1000);
        timer.schedule(task1, 1000);
        timer.schedule(task2, 1000);
    }
}
